aws:ViaAWSService を利用して、サービス経由のリクエストに対して拒否しないよう条件を緩和できるかやってみた
はじめに
テクニカルサポートの 片方 です。
AWS グローバル条件コンテキストキー の "aws:ViaAWSService"
について、検証する機会があったのでやってみました。
本機能について簡単に説明すると、AWS サービスがユーザーに代わって別のサービスにリクエストを実行するかどうか確認します。
サービスが IAM プリンシパルの認証情報を使用し、プリンシパルに代わってリクエストを実行すると、リクエストコンテキストキーは "true"
を返します。サービスがサービスロールまたはサービスリンクロールを使用してプリンシパルに代わって呼び出しを行う場合、コンテキストキーは "false"
を返します。リクエストコンテキストキーは、プリンシパルが直接呼び出しを行ったときも "false"
を返します。
弊社ブログがとても参考になるのでご一読をお勧めします。
準備
以下の権限を付与したユーザー(test-user)を作成しました。
検証に用いたサービスは、AWS Transfer Family で、SFTP プロトコル、VPC 内でエンドポイントをホストし内部アクセスに限定とする設定としました。
- AdministratorAccess
- カスタマー管理ポリシー
※ Test タグを付与しなければ VPC エンドポイントを作成できないようにしています
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Deny", "Action": "ec2:CreateVpcEndpoint", "Resource": "arn:aws:ec2:*:*:vpc-endpoint/*", "Condition": { "Null": { "aws:RequestTag/Test": "true" } } } ] }
やってみた
有効にするプロトコルを SFTP で選択。
サービスマネージドを選択。
エンドポイントのタイプを、VPC でホストで選択。アクセスは内部で選択。
ドメインは S3 を選択。
検証用のため、他は設定せず「次へ」。「作成」をクリック。
「作成」ボタンをクリックすると、以下エラーメッセージを確認することができました。
CreateServer で VPC を指定した際に、Transfer サービスが作成する VPC エンドポイントにはサーバに指定したタグを指定しないため、"aws:RequestTag/Test"
条件を満たすことができず拒否されたと思われます。
※ 抜粋及びマスクしています。
サーバー (Error calling CreateVpcEndpoint: You are not authorized to perform this operation. User: arn:aws:iam::123456789012:user/test-user is not authorized to perform: ec2:CreateVpcEndpoint on resource: arn:aws:ec2:ap-northeast-1:123456789012:vpc-endpoint/* with an explicit deny in an identity-based policy. Encoded authorization failure message:
aws:ViaAWSService を追加
test-user にアタッチしているカスタマー管理ポリシーの内容を以下のように修正して、再度試してみました。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Deny", "Action": "ec2:CreateVpcEndpoint", "Resource": "arn:aws:ec2:*:*:vpc-endpoint/*", "Condition": { "Null": { "aws:RequestTag/Test": "true" }, "BoolIfExists": { "aws:ViaAWSService": "false" } } } ] }
結果は以下の通り、エラーなど発生せずに作成することができました。
まとめ
Transfer Family がマネージドの VPC エンドポイントを作成する際には、サービスがユーザーに代わって "CreateVpcEndpoint"
API を実行しています。
そのため、グローバル条件コンテキストキー "aws:ViaAWSService"
は "true"
になるリクエストと考えられます。
今回は若干広い緩和となっているものの、タグ条件を満たさないかつ "aws:ViaAWSService"
が "false"
の場合に拒否するような方法においては、こちらをご参考いただければ幸いです。
参考資料
- AWS グローバル条件コンテキストキー - aws:ViaAWSService
- IAM ポリシーで特定条件のアクセス制限をかけつつ、AWS サービスのアクセスは許可したいときの対処方法 | DevelopersIO
- AWS Transfer Family とは - AWS Transfer Family
アノテーション株式会社について
アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。当社は様々な職種でメンバーを募集しています。「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。